/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.Caixa;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author WillianFrias
 */
public class CaixaDAOImpl implements GenericDAO {

    private Connection conn;
    private ResultSet rs;

    public CaixaDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
            System.out.println("Conectado com Sucesso!");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    @Override
    public Boolean cadastrar(Object object) {
        PreparedStatement stmt = null;
        Caixa caixa = (Caixa) object;
        String sql = "insert into caixa(data_lancamento_caixa, valor_caixa, status_caixa, tipo_lancamento_caixa, descricao_caixa, nominal_caixa)"
                + "values (?,?,?,?,?,?);";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDate(1, new java.sql.Date(caixa.getDataLancamentoCaixa().getTime()));
            stmt.setDouble(2, caixa.getValorCaixa());
            stmt.setString(3, caixa.getStatusCaixa().toUpperCase());
            stmt.setString(4, caixa.getTipoLancamentoCaixa().toUpperCase());
            stmt.setString(5, caixa.getDescricaoCaixa().toUpperCase());
            stmt.setString(6, caixa.getNominalCaixa().toUpperCase());
            stmt.execute();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Caixa! Erro: " + ex.getMessage());
            ex.printStackTrace();
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parametros de conexão! Erro: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
    }

    @Override
    public List<Object> listar() {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Object> resultado = new ArrayList<Object>();
        String sql = "select c.* from caixa c order by c.nominal_caixa";

        try {
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Caixa caixa = new Caixa();
                caixa.setIdCaixa(rs.getInt("id_caixa"));
                caixa.setDataLancamentoCaixa(rs.getDate("data_lancamento_caixa"));
                caixa.setValorCaixa(rs.getDouble("valor_caixa"));
                caixa.setStatusCaixa(rs.getString("status_caixa"));
                caixa.setTipoLancamentoCaixa(rs.getString("tipo_lancamento_caixa"));
                caixa.setDescricaoCaixa(rs.getString("descricao_caixa"));
                caixa.setNominalCaixa(rs.getString("nominal_caixa"));

                resultado.add(caixa);
            }
        } catch (SQLException ex) {
            System.out.print("Problemas ao listar Caixa! Erro: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro: " + ex.getMessage());
                ex.printStackTrace();
            }
            return resultado;
        }
    }

    @Override
    public Object carregar(int idObject) {

        PreparedStatement stmt = null;
        ResultSet rs = null;
        Caixa caixa = null;

        String sql = "select c.* from caixa c where id_caixa=?";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();

            while (rs.next()) {
                caixa = new Caixa();
                caixa.setIdCaixa(rs.getInt("id_caixa"));
                caixa.setDataLancamentoCaixa(rs.getDate("data_lancamento_caixa"));
                caixa.setValorCaixa(rs.getDouble("valor_caixa"));
                caixa.setStatusCaixa(rs.getString("status_caixa"));
                caixa.setTipoLancamentoCaixa(rs.getString("tipo_lancamento_caixa"));
                caixa.setDescricaoCaixa(rs.getString("descricao_caixa"));
                caixa.setNominalCaixa(rs.getString("nominal_caixa"));

            }
            return caixa;
        } catch (SQLException ex) {
            System.out.print("Problemas ao carregar Caixa! Erro: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro: " + ex.getMessage());
                ex.printStackTrace();
            }
        }

    }

    @Override
    public Boolean alterar(Object object) {
        PreparedStatement stmt = null;
        Caixa caixa = (Caixa) object;
        String sql = "update caixa set data_lancamento_caixa = ?, valor_caixa = ?, status_caixa = ?,"
                + "tipo_lancamento_caixa = ?, descricao_caixa = ?, nominal_caixa = ?"
                + " where id_caixa = ?";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDate(1, new java.sql.Date(caixa.getDataLancamentoCaixa().getTime()));
            stmt.setDouble(2, caixa.getValorCaixa());
            stmt.setString(3, caixa.getStatusCaixa().toUpperCase());
            stmt.setString(4, caixa.getTipoLancamentoCaixa().toUpperCase());
            stmt.setString(5, caixa.getDescricaoCaixa().toUpperCase());
            stmt.setString(6, caixa.getNominalCaixa().toUpperCase());
            stmt.setInt(7, caixa.getIdCaixa());
            stmt.executeUpdate();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao alterar Caixa! Erro CaixaDAO: " + ex.getMessage());
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parametros de conexão Alterar Caixa! Erro CaixaDAO:" + ex.getMessage());
            }
        }
    }
}
